package controlador;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import modelo.servicios.InformacionBasica;
import org.apache.log4j.Logger;

/**
 * Clase que controla las acciones del nodo coordinador con respecto al primer tanque no coordinador
 * @author Eduardo
 */
public class ServidorDesbordamiento1 extends Thread {

    private static ServerSocket servidor = null;
    private static boolean kill = false;
    private static Logger logger = Logger.getLogger(ServidorDesbordamiento1.class);

    /**
     * Constructor de la clase que maneja las acciones del nodo coordinador con respecto al primer
     * tanque no coordinador
     */
    public ServidorDesbordamiento1() {
        start();
    }

    @Override
    public void run() {
        InformacionBasica ib = (new Informacion()).obtenerInformacionBasica();

        try {
            servidor = new ServerSocket(ib.getPuertoSD1());
        } catch (IOException ex) {
            System.err.println(ex);
        }

        if (ib.getPuertoSD1() > 1024) {
            while(!kill) {
                try {
                    logger.info("Esperando información de desbordamiento del tanque " +
                            ib.getIdTanque1() + " por el puerto " + ib.getPuertoSD1());
                    System.out.println("Esperando información de desbordamiento del tanque " +
                            ib.getIdTanque1() + " por el puerto " + ib.getPuertoSD1());

                    /**
                     * Recibiendo entradas de petróleo
                     */
                    Socket sock = servidor.accept();

                    /**
                     * Abriendo flujo de entrada de datos
                     */
                    ObjectInputStream input = new ObjectInputStream(sock.getInputStream());
                    String estadoRecibido = (String)input.readObject();
                       
                    String mensaje = "Recibiendo la siguiente informacion del tanque " +
                            ib.getIdTanque1() + ":\n'" + estadoRecibido + "'";

                    if (!estadoRecibido.equals("false")) {
                        logger.info(mensaje);
                        System.out.println(mensaje);
                    }

                    /**
                     * Invocación al método que se encarga de comprobar si los tanques están
                     * desbordados. Si los tres tanques están desbordados termina la ejecución de
                     * la aplicación.
                     */
                    terminarEjecucion(Informacion.validarDesbordamiento(estadoRecibido));
                    
                    /**
                     * Cerrando el flujo de entrada de datos
                     */
                    input.close();

                    /**
                     * Cerrando el socket
                     */
                    System.out.println("Cerrando el socket");
                    sock.close();
                } catch (IOException ex) {
                    logger.error("Ocurrio un error de entrada/salida de datos");
                    System.out.println("Ocurrió un error de entrada/salida de datos");
                } catch (ClassNotFoundException ex) {
                    logger.error("Ocurrio un error de Clase No Encontrada");
                    System.out.println("Ocurrió un error de Clase No Encontrada");
                }
            }
        }
    }

    /**
     * Termina la ejecución del hilo
     * @param kill Valor lógico que permite determinar cuándo un hilo será detenido
     */
    public void terminarEjecucion(boolean kill) {
        ServidorDesbordamiento1.kill = kill;
    }
}